#ifndef OBJC_NODE_H
#define OBJC_NODE_H

#include <stdarg.h>
#include <sobjc-commons/str_list.h>

typedef struct objc_node        *objc_node_t;

enum OBJC_VISIBILITY {
  OBJC_PRIVATE,
  OBJC_PROTECTED,
  OBJC_PUBLIC
};

enum OBJC_NODE_TYPE {
  OBJC_ABS_DCLR_NODE,                /* abstract-declarator */
  OBJC_ADD_EXPR_NODE,                /* additive-expression */
  OBJC_AND_EXPR_NODE,                /* and-expression */
  OBJC_ARG_EXPR_LIST_NODE,           /* argument-expression-list */
  OBJC_ARRAY_DIR_DCLR_NODE,          /* array-direct-declarator */
  OBJC_ARRAY_REF_EXPR_NODE,          /* array-reference-expression */
  OBJC_ASSIGN_EXPR_NODE,             /* assignment-expression */
  OBJC_ASSIGN_OP_NODE,               /* assignment-operator */
  OBJC_BASE_DCLR_NODE,               /* base-declarator */
  OBJC_CAST_EXPR_NODE,               /* cast-expression */
  OBJC_CAT_INTF_NODE,                /* category-interface */
  OBJC_CAT_INTF_DECL_LIST_NODE,      /* category-interface-declaration-list */
  OBJC_CAT_IMPL_NODE,                /* category-implementation */
  OBJC_CAT_SPCR_NODE,                /* category-specifier */
  OBJC_CLS_DECL_NODE,                /* class-declaration */
  OBJC_CLS_DCLR_LIST_NODE,           /* class-declarator-list */
  OBJC_CLS_INTF_NODE,                /* class-interface */
  OBJC_CLS_INTF_DECL_NODE,           /* class-interface-declaration */
  OBJC_CLS_IMPL_NODE,                /* class-implementation */
  OBJC_CLS_NAME_NODE,                /* class-name */
  OBJC_CLS_OBJ_RECV_NODE,            /* class-object-receiver */
  OBJC_CLS_SPCR_NODE,                /* class-specifier */
  OBJC_CLS_TYPE_NODE,                /* class-type */
  OBJC_CLS_TYPE_SPCR_NODE,           /* class-type-specifier */
  OBJC_COMPOUND_STMT_NODE,           /* compound-statement */
  OBJC_COND_EXPR_NODE,               /* conditional-expression */
  OBJC_CONST_NODE,                   /* constant */
  OBJC_CONST_DIR_ABS_DCLR_NODE,      /* constant-direct-abstract-declarator */
  OBJC_DECL_NODE,                    /* declaration */
  OBJC_DECL_SPCR_NODE,               /* declaration-specifier */
  OBJC_DECL_SPCR_LIST_NODE,          /* declaration-specifier-list */
  OBJC_DCLR_NODE,                    /* declarator */
  OBJC_DECL_LIST_NODE,               /* declaration-list */
  OBJC_DIR_ABS_DCLR_NODE,            /* direct-abstract-declarator */
  OBJC_DIR_DCLR_NODE,                /* direct-declarator */
  OBJC_EMBED_TYPE_SPCR_NODE,         /* embedded-type-specifier */
  OBJC_ENC_EXPR_NODE,                /* encode-expression */
  OBJC_ENUM_NODE,                    /* enumerator */
  OBJC_ENUM_LIST_NODE,               /* enumerator-list */
  OBJC_ENUM_SPCR_NODE,               /* enum-specifier */
  OBJC_EQ_EXPR_NODE,                 /* equality-expression */
  OBJC_EXCL_OR_EXPR_NODE,            /* exclusive-or-expression */
  OBJC_EXPR_NODE,                    /* expression */
  OBJC_XDECL_NODE,                   /* external-declaration */
  OBJC_EXPR_STMT_NODE,               /* expression-statement */
  OBJC_FUNC_CALL_EXPR_NODE,          /* function-call-expression */
  OBJC_FUNC_DEF_NODE,                /* function-definition */
  OBJC_FUNC_DIR_DCLR_NODE,           /* function-direct-declarator */
  OBJC_GCC_ASM_CLOB_LIST_NODE,       /* gcc-asm-clobber-list */
  OBJC_GCC_ASM_OP_NODE,              /* gcc-asm-operand */
  OBJC_GCC_ASM_OP_LIST_NODE,         /* gcc-asm-operand-list */
  OBJC_GCC_ASM_OPT_LIST_NODE,        /* gcc-asm-option-list */
  OBJC_GCC_ASM_NODE,                 /* gcc-assembly */
  OBJC_GCC_ASM_STMT_NODE,            /* gcc-asm-statement */
  OBJC_GCC_ATTR_SPCR_NODE,           /* gcc-attribute-specifier */
  OBJC_GCC_DIR_ATTR_SPCR_NODE,       /* gcc-direct-attribute-specifier */
  OBJC_GCC_DIR_ATTR_SPCR_LIST_NODE,  /* gcc-direct-attribute-specifier-list */
  OBJC_IDENT_NODE,                   /* identifier */
  OBJC_IDENT_LIST_NODE,              /* identifier-list */
  OBJC_IMPL_DEF_NODE,                /* implementation-definition */
  OBJC_IMPL_DEF_LIST_NODE,           /* implementation-definition-list */
  OBJC_INCL_OR_EXPR_NODE,            /* inclusive-or-expression */
  OBJC_INC_OR_DEC_EXPR_NODE,         /* increment-or-decrement-expression */
  OBJC_INIT_DCLR_NODE,               /* init-declarator */
  OBJC_INIT_DCLR_LIST_NODE,          /* init-declarator-list */
  OBJC_INTR_NODE,                    /* initializer */
  OBJC_INTR_LIST_NODE,               /* initializer-list */
  OBJC_IVAR_DECL_NODE,               /* instance-variable-declaration */
  OBJC_IVAR_DECL_LIST_NODE,          /* instance-variable-declaration-list */
  OBJC_IVAR_LIST_NODE,               /* instance-variable-list */
  OBJC_INTF_DECL_NODE,               /* interface-declaration */
  OBJC_INTF_DECL_LIST_NODE,          /* interface-declaration-list */
  OBJC_ITER_STMT_NODE,               /* iteration-statement */
  OBJC_JUMP_STMT_NODE,               /* jump-statement */
  OBJC_KW_ARG_EXPR_NODE,             /* keyword-argument-expression */
  OBJC_KW_ARG_EXPR_LIST_NODE,        /* keyword-argument-expression-list */
  OBJC_KW_ARG_SEL_NODE,              /* keyword-argument-selector */
  OBJC_KW_DCLR_NODE,                 /* keyword-declarator */
  OBJC_KW_MSG_EXPR_NODE,             /* keyword-message-expression */
  OBJC_KW_SEL_NODE,                  /* keyword-selector */
  OBJC_LABEL_STMT_NODE,              /* labeled-statement */
  OBJC_LOG_OR_EXPR_NODE,             /* logical-or-expression */
  OBJC_LOG_AND_EXPR_NODE,            /* logical-and-expression */
  OBJC_MTH_DECL_NODE,                /* method-declaration */
  OBJC_MTH_DCLR_NODE,                /* method-declarator */
  OBJC_MTH_DEF_NODE,                 /* method-definition */
  OBJC_MTH_KW_SEL_NODE,              /* method-keyword-selector */
  OBJC_MTH_QUAL_NODE,                /* method-qualifier */
  OBJC_MTH_QUAL_LIST_NODE,           /* method-qualifier-list */
  OBJC_MTH_SPCR_NODE,                /* method-specifier */
  OBJC_MTH_TYPE_NODE,                /* method-type */
  OBJC_MTH_UNARY_SEL_NODE,           /* method-unary-selector */
  OBJC_MSG_EXPR_NODE,                /* message-expression */
  OBJC_MULTI_EXPR_NODE,              /* multiplicative-expression */
  OBJC_OBJC_STR_NODE,                /* objective-c-string */
  OBJC_PARAM_DECL_NODE,              /* parameter-declaration */
  OBJC_PARAM_DIR_ABS_DCLR_NODE,      /* parameter-direct-abstract-declarator */
  OBJC_PARAM_LIST_NODE,              /* parameter-list */
  OBJC_PARAM_TYPE_LIST_NODE,         /* parameter-type-list */
  OBJC_PTR_NODE,                     /* pointer */
  OBJC_PRIM_EXPR_NODE,               /* primary-expression */
  OBJC_PRTC_DECL_NODE,               /* protocol-declaration */
  OBJC_PRTC_EXPR_NODE,               /* protocol-expression */
  OBJC_PRTC_LIST_NODE,               /* protocol-list */
  OBJC_PRTC_REF_LIST_NODE,           /* protocol-reference-list */  
  OBJC_RECV_NODE,                    /* receiver */
  OBJC_RECV_TYPE_NODE,               /* receiver-type */
  OBJC_REL_EXPR_NODE,                /* relational-expression */
  OBJC_SEALED_NODE,                  /* sealed */
  OBJC_SELECT_STMT_NODE,             /* selection-statement */
  OBJC_SEL_EXPR_NODE,                /* selector-expression */
  OBJC_SHIFT_EXPR_NODE,              /* shift-expression */
  OBJC_SIZE_EXPR_NODE,               /* size-expression */
  OBJC_SIZE_TYPE_EXPR_NODE,          /* size-type-expression */
  OBJC_SPCR_QUAL_LIST_NODE,          /* specifier-qualifier-list */
  OBJC_STMT_NODE,                    /* statement */
  OBJC_STMT_LIST_NODE,               /* statement-list */
  OBJC_STORAGE_CLS_SPCR_NODE,        /* storage-class-specifier */
  OBJC_STR_NODE,                     /* string */
  OBJC_STRUCT_DECL_NODE,             /* struct-declaration */
  OBJC_STRUCT_DECL_LIST_NODE,        /* struct-declaration-list */
  OBJC_STRUCT_DCLR_NODE,             /* struct-declarator */
  OBJC_STRUCT_DCLR_LIST_NODE,        /* struct-declarator-list */
  OBJC_SU_NODE,                      /* struct-or-union */
  OBJC_SU_REF_EXPR_NODE,             /* struct-or-union-reference-expression */
  OBJC_SU_SPCR_NODE,                 /* struct-or-union-specifier */
  OBJC_SUPER_NODE,                   /* super */
  OBJC_SCLS_NAME_NODE,               /* superclass-name */
  OBJC_TUNIT_NODE,                   /* transaction unit */
  OBJC_TYPEDEF_NAME_NODE,            /* typedef-name */
  OBJC_TYPE_NAME_NODE,               /* type-name */
  OBJC_TYPE_SPCR_NODE,               /* type-specifier */
  OBJC_TYPE_QUAL_NODE,               /* type-qualifier */
  OBJC_TYPE_QUAL_LIST_NODE,          /* type-qualifier-list */
  OBJC_URARY_OP_NODE,                /* unary-operator */
  OBJC_UNARY_OP_EXPR_NODE,           /* unary-operator-expression */
  OBJC_UNARY_MSG_EXPR_NODE,          /* unary-message-expression */
  OBJC_UNARY_MSG_SEL_NODE,           /* unary-message-selector */
  OBJC_VSBL_SPEC_NODE                /* visibility-specification */
};

struct objc_node {
  int type;
  objc_node_t parent;
  struct objc_scope *scope;

  /* each node attributes */
  union {
    int word;
    int ival;
    int tag;
    char *sval;
    const char *csval;
    objc_str_list_t strs;
    objc_node_t node;
    struct {
      int nsubs;
      objc_node_t *subs;
    } l;
    struct {
      objc_node_t ptr;
      objc_node_t dir_abs_dclr;
    } abs_dclr;
    struct {
      objc_node_t array;
      objc_node_t ref;
    } array_ref_expr;
    struct {
      objc_node_t dir_dclr;
      objc_node_t expr;
    } array_dir_dclr;
    struct {
      objc_node_t ptr;
      objc_node_t dir_dclr;
    } base_dclr;
    struct {
      objc_node_t left;
      const char *op;
      objc_node_t right;
    } bin_expr;
    struct {
      objc_node_t type;
      objc_node_t expr;
    } cast_expr;
    struct {
      objc_node_t cat_spcr;
      objc_node_t impl_def_list;
    } cat_impl;
    struct {
      objc_node_t cat_spcr;
      objc_node_t cat_intf_decl_list;
    } cat_intf;
    struct {
      objc_node_t prtc_ref_list;
      objc_node_t intf_decl_list;
    } cat_intf_decl_list;
    struct {
      char *cls_name;
      char *cat_name;
    } cat_spcr;
    struct {
      objc_node_t cls_spcr;
      objc_node_t impl_def_list;
    } cls_impl;
    struct {
      objc_node_t cls_spcr;
      objc_node_t cls_intf_decl;
    } cls_intf;
    struct {
      objc_node_t prtc_ref_list;
      objc_node_t ivar_list;
      objc_node_t intf_decl_list;
    } cls_intf_decl;
    struct {
      char *name;
      char *super_name;
    } cls_spcr;
    struct {
      objc_node_t decl_list;
      objc_node_t stmt_list;
    } compound_stmt;
    struct {
      objc_node_t cond;
      objc_node_t t_expr;
      objc_node_t f_expr;
    } cond_expr;
    struct {
      int tag;
      char *val;
    } const_val;
    struct {
      objc_node_t dir_abs_dclr;
      objc_node_t expr;
    } const_dir_abs_dclr;
    struct {
      objc_node_t decl_spcr_list;
      objc_node_t init_dclr_list;
    } decl;
    struct {
      objc_node_t base_dclr;
      objc_node_t gcc_attr_spcr;
      objc_node_t gcc_asm;
    } dclr;
    struct {
      char *name;
      objc_node_t expr;
    } enmr;
    struct {
      char *name;
      objc_node_t enum_list;
    } enum_spcr;
    struct {
      objc_node_t func;
      objc_node_t arg;
    } func_call_expr;
    struct {
      objc_node_t decl_spcr_list;
      objc_node_t dclr;
      objc_node_t decl_list;
      objc_node_t stmt;
    } func_def;
    struct {
      objc_node_t dir_dclr;
      objc_node_t param_list;
    } func_dir_dclr;
    struct {
      const char *asm_word;
      const char *volatile_word;
      char *stmt;
      objc_node_t opts;
    } gcc_asm;
    struct {
      objc_node_t out_op;
      objc_node_t in_op;
      objc_node_t clob;
    } gcc_asm_opts;
    struct {
      char *stmt;
      objc_node_t expr;
    } gcc_asm_op;
    struct {
      objc_node_t gcc_attr_spcr;
      objc_node_t dclr;
      objc_node_t gcc_asm;
    } gcc_decl;
    struct {
      char *name;
      objc_node_t expr;
    } gcc_dir_attr_spcr;
    struct {
      int prefix;
      const char *op;
      objc_node_t expr;
    } inc_or_dec_expr;
    struct {
      objc_node_t dclr;
      objc_node_t init;
    } init_dclr;
    struct {
      int tag;
      objc_node_t init;
      objc_node_t cond;
      objc_node_t action;
      objc_node_t stmt;
    } iter_stmt;
    struct {
      objc_node_t spcr_qual_list;
      objc_node_t dclr;
    } ivar_decl;
    struct {
      int tag;
      objc_node_t expr;
      char *name;
    } jump_stmt;
    struct {
      size_t name_lc;
      size_t colon_lc;
      char *name;
      objc_node_t expr;
    } kw_arg_expr;
    struct {
      char *name;
      objc_node_t mtype;
      char *arg;
    } kw_dclr;
    struct {
      unsigned int num;
      objc_node_t recv;
      char *sel_name;
      objc_node_t arg_list;
    } kw_msg_expr;
    struct {
      int tag;
      objc_node_t expr;
      objc_node_t stmt;
    } label_stmt;
    struct {
      objc_node_t mth_qual_list;
      objc_node_t mth_spcr;
      objc_node_t mth_sel;
    } mth_dclr;
    struct {
      objc_node_t mth_dclr;
      objc_node_t decl_list;
      objc_node_t stmt;
    } mth_def;
    struct {
      objc_node_t sel;
      char *name;
      int vargs;
    } mth_kw_sel;
    struct {
      int rtype;
      objc_node_t mtype;
    } mth_spcr;
    struct {
      size_t lc;
      char *s;
      int n;
    } objc_str;
    struct {
      objc_node_t decl_spcr_list;
      objc_node_t dclr;
    } param_decl;
    struct {
      objc_node_t dir_abs_dclr;
      objc_node_t param_type_list;
    } param_dir_abs_dclr;
    struct {
      objc_node_t param_list;
      int vargs;
    } param_type_list;
    struct {
      char *name;
      objc_node_t prtc_ref_list;
      objc_node_t intf_decl_list;
    } prtc_decl;
    struct {
      objc_node_t gcc_attr_spcr;
      objc_node_t type_qual_list;
      objc_node_t ptr;
    } ptr;
    struct {
      int tag;
      objc_node_t cond;
      objc_node_t stmt;
      objc_node_t else_stmt;
    } select_stmt;
    struct {
      objc_node_t spcr_qual_list;
      objc_node_t dclr_list;
    } struct_decl;
    struct {
      objc_node_t dclr;
      objc_node_t expr;
    } struct_dclr;
    struct {
      objc_node_t expr;
      int dir;
      char *name;
    } su_ref_expr;
    struct {
      int type;
      char *name;
      objc_node_t decl_list;
    } su_spcr;
    struct {
      objc_node_t spcr_qual_list;
      objc_node_t abs_dclr;
    } type_name;
    struct {
      unsigned int num;
      objc_node_t recv;
      char *sel_name;
    } unary_msg_expr;
  } a;
};

objc_node_t objc_make_node(int);
objc_node_t objc_make_list_node(int, objc_node_t, ...);
objc_node_t objc_make_list_nodev(int, objc_node_t, va_list);
objc_node_t objc_make_bin_expr_node(int, objc_node_t, const char *, objc_node_t);
void objc_free_node(objc_node_t);
void objc_node_add(objc_node_t, objc_node_t);
void objc_node_add_str(objc_node_t, const char *);
void objc_node_insert(objc_node_t, objc_node_t);
const char *objc_node_name(objc_node_t);
char *objc_node_type_name(objc_node_t);
struct objc_scope *objc_node_scope(objc_node_t);
int objc_node_has_type_ptr_size(objc_node_t);
int objc_list_node_not_empty(objc_node_t);
char *objc_node_recv_cache_var(objc_node_t);
char *objc_node_get_method_name(objc_node_t);
char *objc_node_get_ident_name(objc_node_t);

objc_node_t objc_make_abs_dclr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_add_expr_node(objc_node_t, const char *, objc_node_t);
objc_node_t objc_make_and_expr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_arg_expr_list_node(objc_node_t);
objc_node_t objc_make_array_dir_dclr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_array_ref_expr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_assign_expr_node(objc_node_t, const char *, objc_node_t);
objc_node_t objc_make_attr_decl_node(objc_node_t, objc_node_t);
objc_node_t objc_make_base_dclr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_cast_expr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_cat_impl_node(objc_node_t, objc_node_t);
objc_node_t objc_make_cat_intf_node(objc_node_t, objc_node_t);
objc_node_t objc_make_cat_intf_decl_list_node(objc_node_t, objc_node_t);
objc_node_t objc_make_cat_spcr_node(const char *, const char *);
objc_node_t objc_make_cls_decl_node(objc_node_t);
objc_node_t objc_make_cls_dclr_list_node(const char *);
objc_node_t objc_make_cls_impl_node(objc_node_t, objc_node_t);
objc_node_t objc_make_cls_intf_node(objc_node_t, objc_node_t);
objc_node_t objc_make_cls_intf_decl_node(objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_cls_name_node(const char *);
objc_node_t objc_make_cls_obj_recv_node(const char *);
objc_node_t objc_make_cls_spcr_node(const char *, const char *);
objc_node_t objc_make_compound_stmt_node(objc_node_t, objc_node_t);
objc_node_t objc_make_cond_expr_node(objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_const_node(int, char *);
objc_node_t objc_make_const_dir_abs_dclr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_decl_node(objc_node_t, objc_node_t);
objc_node_t objc_make_decl_list_node(objc_node_t);
objc_node_t objc_make_decl_spcr_list_node(objc_node_t);
objc_node_t objc_make_dclr_node(objc_node_t, objc_node_t, objc_node_t);
char *objc_node_dclr_name(objc_node_t);
objc_node_t objc_make_enc_expr_node(objc_node_t);
objc_node_t objc_make_enum_node(char *, objc_node_t);
objc_node_t objc_make_enum_list_node(objc_node_t);
objc_node_t objc_make_enum_spcr_node(const char *, objc_node_t);
objc_node_t objc_make_eq_expr_node(objc_node_t, const char *, objc_node_t);
objc_node_t objc_make_exc_or_expr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_expr_node(objc_node_t);
objc_node_t objc_make_expr_stmt_node(objc_node_t);
objc_node_t objc_make_func_call_expr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_func_def_node(objc_node_t, objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_func_dir_dclr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_gcc_asm_node(const char *, const char *, char *, objc_node_t);
objc_node_t objc_make_gcc_asm_opt_list_node(objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_gcc_asm_op_list_node(objc_node_t);
objc_node_t objc_make_gcc_asm_op_node(char *, objc_node_t);
objc_node_t objc_make_gcc_asm_clob_list_node(char *);
objc_node_t objc_make_gcc_asm_stmt_node(objc_node_t);
objc_node_t objc_make_gcc_attr_spcr_node(objc_node_t);
objc_node_t objc_make_gcc_dir_attr_spcr_list_node(objc_node_t);
objc_node_t objc_make_gcc_dir_attr_spcr_node(char *, objc_node_t);
objc_node_t objc_make_ident_node(char *);
objc_node_t objc_make_ident_list_node(char *);
objc_node_t objc_make_impl_def_list_node(objc_node_t);
objc_node_t objc_make_incl_or_expr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_inc_or_dec_expr_node(int, const char *, objc_node_t);
objc_node_t objc_make_init_dclr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_init_dclr_list_node(objc_node_t);
objc_node_t objc_make_intr_node(objc_node_t);
objc_node_t objc_make_intr_list_node(objc_node_t);
objc_node_t objc_make_intf_decl_list_node(objc_node_t);
objc_node_t objc_make_iter_stmt_node(int, objc_node_t, objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_ivar_decl_node(objc_node_t, objc_node_t);
objc_node_t objc_make_ivar_decl_list_node(objc_node_t);
objc_node_t objc_make_jump_stmt_node(int, objc_node_t, char *);
objc_node_t objc_make_kw_arg_expr_node(size_t, size_t, char *, objc_node_t);
objc_node_t objc_make_kw_arg_expr_list_node(objc_node_t);
objc_node_t objc_make_kw_dclr_node(char *, objc_node_t, char *);
objc_node_t objc_make_kw_msg_expr_node(objc_node_t, char *, objc_node_t);
objc_node_t objc_make_kw_sel_node(objc_node_t);
objc_node_t objc_make_label_stmt_node(int, objc_node_t, objc_node_t);
objc_node_t objc_make_log_and_expr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_log_or_expr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_mth_def_node(objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_mth_decl_node(objc_node_t);
objc_node_t objc_make_mth_dclr_node(objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_mth_kw_sel_node(objc_node_t, char *, int);
objc_node_t objc_make_mth_qual_node(int);
objc_node_t objc_make_mth_qual_list_node(objc_node_t);
objc_node_t objc_make_mth_spcr_node(int, objc_node_t);
objc_node_t objc_make_mth_unary_sel_node(char *);
objc_node_t objc_make_multi_expr_node(objc_node_t, const char *, objc_node_t);
objc_node_t objc_make_ns_decl_node(objc_node_t);
objc_node_t objc_make_ns_import_node(objc_node_t);
objc_node_t objc_make_objc_str_node(size_t, char *, int);
objc_node_t objc_make_param_decl_node(objc_node_t, objc_node_t);
objc_node_t objc_make_param_dir_abs_dclr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_param_list_node(objc_node_t);
objc_node_t objc_make_param_type_list_node(objc_node_t, int);
objc_node_t objc_make_prtc_decl_node(char *, objc_node_t, objc_node_t);
objc_node_t objc_make_prtc_expr_node(const char *);
objc_node_t objc_make_prtc_list_node(const char *);
objc_node_t objc_make_ptr_node(objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_rel_expr_node(objc_node_t, const char *, objc_node_t);
objc_node_t objc_make_sel_expr_node(char *);
objc_node_t objc_make_select_stmt_node(int, objc_node_t, objc_node_t, objc_node_t);
objc_node_t objc_make_shift_expr_node(objc_node_t, const char *, objc_node_t);
objc_node_t objc_make_size_expr_node(objc_node_t);
objc_node_t objc_make_size_type_expr_node(objc_node_t);
objc_node_t objc_make_spcr_qual_list_node(objc_node_t);
objc_node_t objc_make_stmt_list_node(objc_node_t);
objc_node_t objc_make_storage_cls_spcr_node(int);
objc_node_t objc_make_str_node(char *);
int objc_is_objc_str(objc_node_t);
objc_node_t objc_make_struct_decl_list_node(objc_node_t);
objc_node_t objc_make_struct_decl_node(objc_node_t, objc_node_t);
objc_node_t objc_make_struct_dclr_node(objc_node_t, objc_node_t);
objc_node_t objc_make_struct_dclr_list_node(objc_node_t);
objc_node_t objc_make_su_ref_expr_node(objc_node_t, int, char *);
objc_node_t objc_make_su_spcr_node(int, const char *, objc_node_t);
objc_node_t objc_make_super_node();
objc_node_t objc_make_tunit_node(objc_node_t);
objc_node_t objc_make_type_name_node(objc_node_t, objc_node_t);
objc_node_t objc_make_typedef_name_node(const char *);
objc_node_t objc_make_type_qual_list_node(objc_node_t);
objc_node_t objc_make_type_spcr_node(int);
objc_node_t objc_make_type_qual_node(int);
objc_node_t objc_make_unary_msg_expr_node(objc_node_t, char *);
objc_node_t objc_make_vsbl_spec_node(int);

#endif /* OBJC_NODE_H */
